/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.torresquintero.oncologos.secretaria.controladores;

import com.torresquintero.oncologos.common.entityUtilities.ArticuloUtilities;
import com.torresquintero.oncologos.common.factory.FactoryEntityManager;
import com.torresquintero.oncologos.common.factory.LogginManager;
import com.torresquintero.oncologos.common.factory.Mensajes;
import com.torresquintero.oncologos.entidades.Articulo;
import com.torresquintero.oncologos.entidades.Inventario;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;

/**
 *
 * @author Camilo Andres
 */
public class KardexController {

    /**
     * Variable statica para el partron Singleton
     */
    private static KardexController kardexController;
    /**
     * Administrador de entidades.
     */
    private EntityManager em;
    private List<Inventario> listaInventario;
    private List<Inventario> entraInventario;
    private List<Inventario> saleInventario;

    /**
     * Constructor
     */
    private KardexController() {

        em = FactoryEntityManager.getEm();
        listaInventario = new ArrayList<Inventario>();
        saleInventario = new ArrayList<Inventario>();
        entraInventario = new ArrayList<Inventario>();
    }

    /**
     * Metodo para obtener una instancia singleton de esta clase.
     * 
     * @return
     */
    public static KardexController getInstance() {

        if (kardexController == null) {
            kardexController = new KardexController();
        }
        return kardexController;
    }

    /**
     * Metodo para agregar un cambio al inventario.
     * @param codigo codigo del articulo.
     */
    public void agregaralInventario(String codigoArticulo, String codigoBarras) throws Exception {

        Articulo art = ArticuloUtilities.buscarArticulo(codigoArticulo);
        if (art != null) {
            Inventario inv = new Inventario();
            inv.setArticulo(art);
            inv.setFechaIngreso(new Date());
            inv.setFuncionarioIngreso(LogginManager.getFuncionarioLogedIn());
            inv.setCodigoBarras(codigoBarras);

            entraInventario.add(inv);
        } else {
            throw new Exception(Mensajes.getMensaje("KardexController.noExisteArticulo"));

        }
    }
    
    
    /**
     * Eliminar de la lista temporar
     * @param codigo  codigo de barras.
     */
    public void eliminarLista(String codigo){
        Inventario inv=new Inventario();
        inv.setCodigoBarras(codigo);
        saleInventario.remove(inv);
        entraInventario.remove(inv);
    }

    /**
     * metodo para registrar la salida de un articulo del inventario.
     * @param codigo codigo de barras.
     */
    public void sacarDelInventario(String codigo) throws Exception {

        List<Inventario> lista = em.createNamedQuery(Inventario.CONSULTA_FIND_BY_CODIGO).
                setParameter(Inventario.PARAMETRO_CODIGO, codigo).getResultList();

        if (!lista.isEmpty()) {

            Inventario inv = lista.get(0);
            inv.setFuncionarioSalida(LogginManager.getFuncionarioLogedIn());
            inv.setFechaSalida(new Date());
            //TODO:motivo de lsa salida?
            inv.setMotivoSalida("TODO");
            saleInventario.add(inv);
        } else {
            throw new Exception(Mensajes.getMensaje("KardexController.noExisteArticulo"));
        }
    }
    /**
     * Metodo para listar los articulos del inventario.
     * @param nombre
     * @param codigo
     * @return 
     */
    public List<Articulo> listarArticulos(String nombre, String codigo) {

        List<Articulo> lista = new ArrayList<Articulo>();
         if(nombre.length()>0){
             lista.addAll(ArticuloUtilities.listarArticulosPorNombre(nombre));
         }
        Articulo art = ArticuloUtilities.buscarArticulo(codigo);
        
        if (art != null) {
            lista.add(art);
        }
        Query q=em.createNamedQuery(Inventario.CONSULTA_FIND_BY_ARTICULO);
                
        for (Articulo articulo : lista) {
            q.setParameter(Inventario.PARAMETRO_CODIGO, articulo.getCodigo());
            
            int numero=q.getResultList().size();
            articulo.setCantidad(numero);
            
        }
        
        return lista;

    }
    
    /**
     * Termina la operacion sobre el inventario.
     */
    public void terminar(){
        em.getTransaction().begin();
            
        
        for (Inventario inventario : entraInventario) {
            em.persist(inventario);
            em.flush();
        }
        for (Inventario inventario : saleInventario) {
            em.merge(inventario);
            em.flush();
        }
            
        em.getTransaction().commit();
        kardexController=new KardexController();
    }

    public List<Inventario> getListaInventario() {
        listaInventario=new ArrayList<Inventario>();
        listaInventario.addAll(entraInventario);
        listaInventario.addAll(saleInventario);
        
        return listaInventario;
    }
    
    
    
    
}
